package nio.channel;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;

public class ChannelTest3 {

	public static void main(String[] args) throws IOException {
		
		final Charset charset = Charset.forName( "UTF-8" );
		final byte[] bytes = new byte[30];
		
		final String[] names = { "张三丰" , "张翠山" , "殷素素" , "张无忌" , "敏敏特穆尔" };
		
		// 1、获得 Path 实例
		Path path = Path.of( "file-channel.data" );
		//if( Files.notExists( path ) ) {
		//	Files.createFile( path );
		//}
		
		// 2、打开 FileChannel
		FileChannel channel = FileChannel.open( path , StandardOpenOption.WRITE , StandardOpenOption.CREATE );
		
		// 3、准备缓冲区
		final ByteBuffer buffer = ByteBuffer.allocate( 100 );
		System.out.println( buffer ); // [pos=0 lim=100 cap=100]
		
		for( int id = 1 ; id <= names.length ; id++ ) {
			int index = id - 1 ;
			String name = names[ index ];
			
			buffer.clear(); // 4.1、清除缓冲区 ( 确保本次可以使用整个缓冲区 )
			// 4.2、向缓冲区中写入数据
			buffer.putInt( id ); // 将 id 写入到缓冲区中
			byte[] bs = name.getBytes( charset );
			System.arraycopy( bs ,  0 ,  bytes ,  0 , Math.min( bs.length , bytes.length ) );;
			buffer.put( bytes ); // 将 bytes 数组中的所有字节写入到缓冲区
			
			buffer.flip(); // 4.3、重置缓冲区 ( 以便于处理 起始位置 到 限制位置 之间的内容 )
			
			// 5、通过 channel 把缓冲区中的数据写入通道，并返回直接读取到的有效字节数
			channel.write( buffer );
		}
		
		// 6、关闭 FileChannel
		channel.close();
		
	}

}
